package com.ft.turorial.spring.boot.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.ResponseEntity;
import org.springframework.web.context.request.async.DeferredResult;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2	//该注解用来启用Swagger2
public class Swagger2Config {
	/**
     * SpringBoot默认已经将classpath:/META-INF/resources/和classpath:/META-INF/resources/webjars/映射
     * 所以该方法不需要重写，如果在SpringMVC中，可能需要重写定义（我没有尝试）
     * 重写该方法需要 extends WebMvcConfigurerAdapter
     * 
     */
//    @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("swagger-ui.html")
//                .addResourceLocations("classpath:/META-INF/resources/");
//
//        registry.addResourceHandler("/webjars/**")
//                .addResourceLocations("classpath:/META-INF/resources/webjars/");
//    }

    /**
     * 可以定义多个组，可以根据模块分组，或根据开发环境/测试环境进行分组
     * 比如本类中定义把UserControllerAPI和RoleControllerAPI区分开了
     * （访问页面就可以看到效果了） 
     *
     */
    @Bean
    public Docket UserControllerAPI() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("UserControllerAPI")
                //.genericModelSubstitutes(DeferredResult.class)
                .genericModelSubstitutes(ResponseEntity.class)
                .useDefaultResponseMessages(false)
                .forCodeGeneration(true)
                .pathMapping("/")// base，最终调用接口后会和paths拼接在一起
                .select()
                .paths(PathSelectors.regex("/user/.*"))//过滤的接口
                .build()
                .apiInfo(userControllerApiInfo());
    }

    @Bean
    public Docket RoleControllerAPI() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName("RoleControllerAPI")
                .genericModelSubstitutes(DeferredResult.class)
//              .genericModelSubstitutes(ResponseEntity.class)
                .useDefaultResponseMessages(false)
                .forCodeGeneration(false)
                .pathMapping("/")
                .select()
                .paths(PathSelectors.regex("/role/.*"))//过滤的接口
                .build()
                .apiInfo(roleControllerApiInfo());
    }

    private ApiInfo userControllerApiInfo() {
        ApiInfo apiInfo = new ApiInfoBuilder()
        		.title("Fresh Too Platform API for UserController")
        		.description("FT Platform's RESTFUL API")
        		.termsOfServiceUrl("www.ft.com")	//主页
        		.contact(new Contact("xtiawxf", "", ""))	//联系人/作者
        		.version("0.1")	//(测试)版本
        		.license("The Apache License, Version 2.0") ////链接显示文字
        		.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") //网站链接
        		.build();
        return apiInfo;
    }

    private ApiInfo roleControllerApiInfo() {
        ApiInfo apiInfo = new ApiInfoBuilder()
        		.title("Fresh Too Platform API for RoleController")
        		.description("FT Platform's RESTFUL API")
        		.termsOfServiceUrl("www.ft.com")	//主页
        		.contact(new Contact("xtiawxf", "http://blog.csdn.net/xtiawxf", "zhangjianghua987@sina.com"))	//联系人/作者
        		.version("1.0")	//(实例)版本
        		.license("The Apache License, Version 2.0") ////链接显示文字
        		.licenseUrl("http://www.apache.org/licenses/LICENSE-2.0.html") //网站链接
        		.build();
        return apiInfo;
    }
}
